CTF

您所在的位置:网站首页 ctf 数据分析 CTF

CTF

2023-05-13 15:33| 来源: 网络整理| 查看: 265

目录 一些奇奇怪怪的经历:Linux(kali)的各种命令:各种加密/编码:base家族MD5加密python中str类型和byte类型:emoji-aes编码:词频分析:字频分析:摩斯电码:vigenere(维吉尼亚)密码:希尔密码:Rabbi密码:云隐密码:差分曼彻斯特编码:社会主义核心价值观密码:outguess解密图片:盲文:base64隐写:文本加密为音乐符号:Polybius密码(详见CTFwiki)AES加密(需要key)埃特巴什码(Atbash)DNA编码Text Encoding Brute ForceDecabit编码各种文件头/尾:Misc——流量分析学习记录1、wireshark提取数据流:2、协议分级+导出HTTP对象2、流量包端口隐写(可能会有01互换)3、TCP/FTP协议传输文件(binwalk和foremost都没用):4、有时候可能需要分版本分别导出wireshark使用学习记录USB流量分析键盘流量分析鼠标流量总结一下我的做题步骤(WSL):6、数位板流量分析:MIsc——图片题思路:1、 查看图片属性的详细信息(可能关键信息就在里面)2、 拉入010,查看文件头尾,可能会有不同类型文件文件头混用3、 CRC错误(不能乱改),改宽高,17~20是宽,21~24是高(可用Pictools脚本快速爆破)4、 stegsolve(拉入kali用zsteg快速查看)5、 foremost(配置好后可以直接右键发送-用foremost提取)6、 LSB(最低有效位)隐写:没有密钥的情况有密钥的情况(cloacked-pixel)LSB低位隐写:7、 图片盲水印隐写(两张图片)8、 IDAT块隐写:9、 png数据末尾藏zip:10、 图片的分离和拼接11、 像素点合成12、 Image conbiner(两张图片):13、 图片已加密,且密码信息在图片里:(OurSecret)14、 拼图题:碎图片合成一张图片然后使用gaps智能拼图(在kali和wsl里使用都可以)15、 bmp宽高爆破:16、 可以试试用stegdectet看看是什么加密:17、 JPHS加密:18、BMP可能是wbStego4open隐写,用wbStego4open直接decode19、steghide20、apngdis_gui21、outguess22、近邻法缩放图片23、F5-steganography-master24、pixeljihad(有密码)25、隐写文本可能藏在原图片和隐写文件的中间26.提取图片中等距的像素点得到隐写的图片【二维码类】:1、 bmp转二维码2、 16进制转pyc3、 字符串制作二维码4、 四个TTL值转换一个字节的二进制数5、 aztec codeMisc——excel题思路:Misc——PDF题思路:Misc——Word题思路Misc——txt题思路:Misc——html题思路:Misc——压缩包思路:1、压缩包伪加密zip文件:rar文件:2、CRC爆破(压缩包中文件比较小的时候)3、明文攻击已知所有的明文使用Advanced Archive Password Recovery破解使用pkcrack破解已知部分明文1)简单的加密文本压缩包破解2)利用PNG图片文件头破解3)利用压缩包格式破解4)EXE文件格式破解5 )流量包pcapng格式解密6)网站相关文件破解7)SVG文件格式破解在比赛中的使用记录4、暴力破解(爆破时注意限制长度)5、连环套压缩包6、 未知后缀的压缩包7、从流量包中导出HTTP提取出压缩包8、分卷压缩包合并Misc——视频题思路:Misc——音频题思路:1、波形图分析:摩斯电码2、频谱图分析(有时要调高最高频率):3、LSB(最低有效位隐写):用silenteye解密4、SSTV慢扫描电视:一、Windows中使用RX-SSTV二、拉入kali用qsstv(有时候要用到反向和反相)5、电话音分析6、 WAV[RIFF]的隐写(有 deepsound 和 silenteye 或者其他):7、wav可能是业余无线电文件:8、steghide9、MP3音频隐写MP3stego10、WAV还可能是OpenPuff隐写(有密码)Misc——取证题思路:1、磁盘恢复2、浏览器登录凭证破解Git文件泄露:OSINT1.用yandex识图Others:1、python反编译:2、字节序为何要有字节序

最开始接触CTF时,学的最多的就是Misc,各种编码各种加密还有各种软件的使用…

但无奈MIsc涉及的范围实在太广了,于是就萌生了一边学习一边记录的想法,甚至还想为此写一本指南。

一些奇奇怪怪的经历:

1、一段字符串,用base64异或脚本跑,找正常的字符串

2、rockstar 编程语言,在github上面可以找到,然后在本地用pip安装库

​ 把rock文件转换为py文件,运行即可得到flag

3、给你一个.exe安装包文件,flag藏在安装之前的一大串协议中

4、实在做不出来的时候,可以把flag的格式转其他的编码和题目中的信息比对找规律

5、给你一个gpx文件,在线网站https://www.gpsvisualizer.com/map_input解密

然后地名的首字母连起来就是flag

Linux(kali)的各种命令:1234561、 fls +镜像文件 列出镜像中的文件和目录名并可以显示使用给定名称的目录最近 删除的文件的文件名2、file+文件名 查看文件类型3、binwalk+文件名 查看文件类型4、各种文件的解压命令 7z:7z x +filename.7z

Linux如何配置环境变量

1234sudo vim /etc/profileexport PATH=/usr/local/volatility:$PATHorexport PATH=/usr/lib/python2.7/dist-packages/volatility:$PATH 各种加密/编码:

可以试试直接用ciphey或者CyberChef跑

12#ciphey在windows和wsl里都可以用ciphey -t "aGVsbG8gbXkgbmFtZSBpcyBiZWU=" base家族

详细请看:https://www.cnblogs.com/0yst3r-2046/p/11962942.html

123456781、base16 flag 666C61672、base32 flag MZWGCZY=3、base36 flag 7274324、base58 flag 3cr9Ae5、base64 flag Zmxh6、base85 flag Ao(mg7、base91 flag @iH> a = '寒鸦小站'\>>> type(a)\>>> b = a.encode()\>>> bb'\xe5\xaf\x92\xe9\xb8\xa6\xe5\xb0\x8f\xe7\xab\x99'\>>> type(b) emoji-aes编码:

https://aghorler.github.io/emoji-aes/

词频分析:

一堆文字,看着什么编码都不像的,可能是词频分析,用在线网站跑https://quipqiup.com/

字频分析:

用随波逐流直接分析

摩斯电码:1#第一种情况,只有.-或者只有01 12#第二种情况,加入/或者空格来替换换行符.--/./.-../-.-./---/--/./-/---/-./-.-/-.-./-/..-./--..--/-/...././.--./.-/.../.../.--/---/.-./-../../.../.----/-..../-.../-.--/-/./.../.-./.-/-./-../---/--/.-../-.--/--././-././.-./.-/-/./-../--..- vigenere(维吉尼亚)密码:

1.给了密文和Key

直接拉到cyberchef中解密即可

2.给了密文,没给密钥,但是知道目标明文的格式

先用B神的脚本爆破出Key,然后再把这个Key放到cyberchef中解密

希尔密码:

解密网站:http://www.metools.info/code/hillcipher243.html

已知密文和密钥,并且密钥(key)是一个网址,如http://www.verymuch.net

已知密文和密钥,并且密钥是四个数字

12密文:ymyvzjtxswwktetpyvpfmvcdgywktetpyvpfuedfnzdjsiujvpwktetpyvnzdjpfkjssvacdgywktetpyvnzdjqtincduedfpfkjssne密钥:3 4 19 11 Rabbi密码:

已知密文和密钥,密文有点像base64编码的(可能有+号)

云隐密码:

特征是:密文只由01248组成

用随波逐流或者CTFD中的脚本直接跑

差分曼彻斯特编码:

ID为0x8893CA58的温度传感器的未解码报文为:3EAAAAA56A69AA55A95995A569AA95565556

直接用CTFD中的脚本跑(要去掉开头的3E)

社会主义核心价值观密码:

解密网址:http://www.hiencode.com/cvencode.html

公正民主公正文明公正和谐:abc

outguess解密图片:

在kali中下载outguess:outguess -k ‘abc’ -r mmm.jpg -t flag.txt

outguess -k ‘key’ -r 加密后的图片.jpg -t 明文.txt

盲文:

使用https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=mangwen在线翻译

base64隐写:

直接用CTFD中的脚本跑出答案就行

文本加密为音乐符号:

eg:♭♯♪‖¶♬♭♭♪♭‖‖♭♭♬‖♫♪‖♩♬‖♬♬♭♭♫‖♩♫‖♬♪♭♭♭‖¶∮‖‖‖‖♩♬‖♬♪‖♩♫♭♭♭♭♭§‖♩♩♭♭♫♭♭♭‖♬♭‖¶§♭♭♯‖♫∮‖♬¶‖¶∮‖♬♫‖♫♬‖♫♫§=

直接用在线网站解密:https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=yinyue

敲击码:敲击码

….. ../… ./… ./… ../5,2 3,1 3,1 3,2W L L M

Polybius密码(详见CTFwiki)

类似于11,22,11,24这样的

去逗号改成空格,拉入随波逐流直接解密

AES加密(需要key)

将密文和key拉入CaptfEncoder-win-x64-1.3.0解密

也可能是Base64+AES-128混合加密,直接用厨子解密要注意使用ECB mode并且把Input改为raw(key不足16位的话就在后面补0)

埃特巴什码(Atbash)

类似于:(+w)v&LdG_FhgKhdFfhgahJfKcgcKdc_eeIJ_gFN

拉入厨子直接解密

DNA编码1AATTCAACAACATGCTGC

1、使用CTFD中的DNAcode脚本解密

https://github.com/omemishra/DNA-Genetic-Python-Scripts-CTF

2、网上找的脚本(红明谷杯2023——hacker)

12345678table = 'ACGT'dic = {'AAA': 'a', 'AAC': 'b', 'AAG': 'c', 'AAT': 'd', 'ACA': 'e', 'ACC': 'f', 'ACG': 'g', 'ACT': 'h', 'AGA': 'i', 'AGC': 'j', 'AGG': 'k', 'AGT': 'l', 'ATA': 'm', 'ATC': 'n', 'ATG': 'o', 'ATT': 'p', 'CAA': 'q', 'CAC': 'r', 'CAG': 's', 'CAT': 't', 'CCA': 'u', 'CCC': 'v', 'CCG': 'w', 'CCT': 'x', 'CGA': 'y', 'CGC': 'z', 'CGG': 'A', 'CGT': 'B', 'CTA': 'C', 'CTC': 'D', 'CTG': 'E', 'CTT': 'F', 'GAA': 'G', 'GAC': 'H', 'GAG': 'I', 'GAT': 'J', 'GCA': 'K', 'GCC': 'L', 'GCG': 'M', 'GCT': 'N', 'GGA': 'O', 'GGC': 'P', 'GGG': 'Q', 'GGT': 'R', 'GTA': 'S', 'GTC': 'T', 'GTG': 'U', 'GTT': 'V', 'TAA': 'W', 'TAC': 'X', 'TAG': 'Y', 'TAT': 'Z', 'TCA': '1', 'TCC': '2', 'TCG': '3', 'TCT': '4', 'TGA': '5', 'TGC': '6', 'TGG': '7', 'TGT': '8', 'TTA': '9', 'TTC': '0', 'TTG': ' '}cipher = 'TCATCAACAAAT'plain = ''for i in range(0, len(cipher), 3): plain += dic[cipher[i:i+3]]print(plain) Text Encoding Brute Force

如果赛博厨子转完两次Hex后依然是乱码,可以用Text Encoding Brute Force爆破试试看

例子:红明谷杯2023——阿尼亚

Decabit编码1+-+-++--+- ++---+-++- -+--++-++- +--++-++-- --+++++--- ++-++---+- +++-+-+--- +-+-+---++ ---+++-++- -+--++-++- -+--+++-+- -+--++-++- -+--++-++- ++-+-+-+-- -+--+++-+- ++-++---+- -++++---+- -+--++-++- ++-+-+-+-- +-+++---+- +++-++---- ---+++-++- +-+-+---++ ++-+-+-+-- +-+-+--++- ++--+--++- -++++---+- +---+++-+- ++-+-+-+-- -++++---+- -+--+++-+- +--+-+-++- +++-+-+--- +-+++---+- -+--+-+++- -+--++-++- ---+++-++- ++++----+- -++++---+- -+--+++-+- -+--++-++- ----+++++- 各种文件头/尾:1234567891011121314151617181920212223242526272829303132333435.zip的文件头:50 4B 03 04 14 00 08 00.rar的文件头:52 61 72 21.rar的文件尾:C4 3D 7B 00 40 07 00.pyc的文件头:03 F3 0D 0A.jpg的文件头:FF D8 FF.png的文件头:89 50 4e 47 0d 0a 1a 0a 文件尾:49 45 4E 44 AE 42 60 82.gif的文件头:47 49 46 38.gz的文件头:1F 8B 08 00TIFF (tif),文件头:49492A00Windows [Bitmap](https://so.csdn.net/so/search?q=Bitmap&spm=1001.2101.3001.7020) (bmp),文件头:424DCAD (dwg),文件头:41433130Adobe Photoshop (psd),文件头:38425053Rich Text Format (rtf),文件头:7B5C727466XML (xml),文件头:3C3F786D6CHTML (html),文件头:68746D6C3EEmail [thorough only] (eml),文件头:44656C69766572792D646174653AOutlook Express (dbx),文件头:CFAD12FEC5FD746FOutlook (pst),文件头:2142444EMS Word/Excel (xls.or.doc),文件头:D0CF11E0MS Access (mdb),文件头:5374616E64617264204AWordPerfect (wpd),文件头:FF575043Postscript (eps.or.ps),文件头:252150532D41646F6265Adobe Acrobat (pdf),文件头:255044462D312EQuicken (qdf),文件头:AC9EBD8FWindows Password (pwl),文件头:E3828596Wave (wav),文件头:57415645AVI (avi),文件头:41564920Real Audio (ram),文件头:2E7261FDReal Media (rm),文件头:2E524D46MPEG (mpg),文件头:000001BAMPEG (mpg),文件头:000001B3Quicktime (mov),文件头:6D6F6F76Windows Media (asf),文件头:3026B2758E66CF11MIDI (mid),文件头:4D546864M4a,文件头:00000018667479704D3441 12#Tips1.PNG文件的前16字节是已知的:89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 Misc——流量分析学习记录1、wireshark提取数据流:

可以用tcpxtract工具:tcpxtract -f 1.pcap

strings webshell.pcapng | grep {

//打印出文件中所有可打印字符

2、协议分级+导出HTTP对象2、流量包端口隐写(可能会有01互换)3、TCP/FTP协议传输文件(binwalk和foremost都没用):

1、直接用wireshark导出为pcap文件然后用networkminer分析

2、拉入kali用tcpxtract提取文件:tcpxtract -f +文件名.pcap

3、直接追踪流提取16进制,根据文件头尾提取出文件

4、有时候可能需要分版本分别导出wireshark使用学习记录

http contains “shell”

USB流量分析

4字节为鼠标流量,8字节为键盘流量。

数据部分在Leftover Capture Data域中

键盘流量分析

例题5:键盘流量分析

先在wsl或者别的虚拟机中用tshark提取数据

12#提取数据的命令,这里用正则表达式剔除了空行tshark -r usb.pcapng -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt

Tips:老版本的tshark提取数据是有冒号的,新版本就没有冒号了,所以需要我们自己添加冒号

12345678910111213141516171819#给键盘流量数据添加冒号.pyf = open('usbdata.txt', 'r')fi = open('out.txt', 'w')while 1: a = f.readline().strip() if a: if len(a) == 16: # 鼠标流量的话len改为8 out = '' for i in range(0, len(a), 2): if i + 2 != len(a): out += a[i] + a[i + 1] + ":" else: out += a[i] + a[i + 1] fi.write(out) fi.write('\n') else: breakfi.close()

加完冒号以后我们就可以直接用脚本翻译数据了

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182#翻译键盘数据1.pynormalKeys = { "04": "a", "05": "b", "06": "c", "07": "d", "08": "e", "09": "f", "0a": "g", "0b": "h", "0c": "i", "0d": "j", "0e": "k", "0f": "l", "10": "m", "11": "n", "12": "o", "13": "p", "14": "q", "15": "r", "16": "s", "17": "t", "18": "u", "19": "v", "1a": "w", "1b": "x", "1c": "y", "1d": "z", "1e": "1", "1f": "2", "20": "3", "21": "4", "22": "5", "23": "6", "24": "7", "25": "8", "26": "9", "27": "0", "28": "", "29": "", "2a": "", "2b": "\t", "2c": "", "2d": "-", "2e": "=", "2f": "[", "30": "]", "31": "\\", "32": "", "33": ";", "34": "'", "35": "", "36": ",", "37": ".", "38": "/", "39": "", "3a": "", "3b": "", "3c": "", "3d": "", "3e": "", "3f": "", "40": "", "41": "", "42": "", "43": "", "44": "", "45": ""}shiftKeys = { "04": "A", "05": "B", "06": "C", "07": "D", "08": "E", "09": "F", "0a": "G", "0b": "H", "0c": "I", "0d": "J", "0e": "K", "0f": "L", "10": "M", "11": "N", "12": "O", "13": "P", "14": "Q", "15": "R", "16": "S", "17": "T", "18": "U", "19": "V", "1a": "W", "1b": "X", "1c": "Y", "1d": "Z", "1e": "!", "1f": "@", "20": "#", "21": "$", "22": "%", "23": "^", "24": "&", "25": "*", "26": "(", "27": ")", "28": "", "29": "", "2a": "", "2b": "\t", "2c": "", "2d": "_", "2e": "+", "2f": "{", "30": "}", "31": "|", "32": "", "33": "\"", "34": ":", "35": "", "36": "", "38": "?", "39": "", "3a": "", "3b": "", "3c": "", "3d": "", "3e": "", "3f": "", "40": "", "41": "", "42": "", "43": "", "44": "", "45": ""}output = []keys = open('out.txt')for line in keys: try: if line[0] != '0' or ( line[1] != '0' and line[1] != '2' ) or line[3] != '0' or line[4] != '0' or line[9] != '0' or line[ 10] != '0' or line[12] != '0' or line[13] != '0' or line[ 15] != '0' or line[16] != '0' or line[18] != '0' or line[ 19] != '0' or line[21] != '0' or line[ 22] != '0' or line[6:8] == "00": continue if line[6:8] in normalKeys.keys(): output += [[normalKeys[line[6:8]]], [shiftKeys[line[6:8]]]][line[1] == '2'] else: output += ['[unknown]'] except: passkeys.close()flag = 0print("".join(output))for i in range(len(output)): try: a = output.index('') del output[a] del output[a - 1] except: passfor i in range(len(output)): try: if output[i] == "": flag += 1 output.pop(i) if flag == 2: flag = 0 if flag != 0: output[i] = output[i].upper() except: passprint('output :' + "".join(output)) 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677#翻译键盘数据2.pymappings = { 0x04: "A", 0x05: "B", 0x06: "C", 0x07: "D", 0x08: "E", 0x09: "F", 0x0A: "G", 0x0B: "H", 0x0C: "I", 0x0D: "J", 0x0E: "K", 0x0F: "L", 0x10: "M", 0x11: "N", 0x12: "O", 0x13: "P", 0x14: "Q", 0x15: "R", 0x16: "S", 0x17: "T", 0x18: "U", 0x19: "V", 0x1A: "W", 0x1B: "X", 0x1C: "Y", 0x1D: "Z", 0x1E: "1", 0x1F: "2", 0x20: "3", 0x21: "4", 0x22: "5", 0x23: "6", 0x24: "7", 0x25: "8", 0x26: "9", 0x27: "0", 0x28: "\n", 0x2a: "[DEL]", 0X2B: " ", 0x2C: " ", 0x2D: "-", 0x2E: "=", 0x2F: "[", 0x30: "]", 0x31: "\\", 0x32: "~", 0x33: ";", 0x34: "'", 0x36: ",", 0x37: "."}nums = []keys = open('out.txt')for line in keys: if line[0] != '0' or line[1] != '0' or line[3] != '0' or line[ 4] != '0' or line[9] != '0' or line[10] != '0' or line[ 12] != '0' or line[13] != '0' or line[15] != '0' or line[ 16] != '0' or line[18] != '0' or line[19] != '0' or line[ 21] != '0' or line[22] != '0': continue nums.append(int(line[6:8], 16))keys.close()output = ""for n in nums: if n == 0: continue if n in mappings: output += mappings[n] else: output += '[unknown]'print('output :\n' + output)

提取出来的数据如果有,我们可以用vscode中的正则匹配来替换他们

鼠标流量

例题6:键盘流量分析

前两步和键盘流量一样,提取数据并加冒号,但是这里要注意判断数据的长度

12345678910111213141516171819#给数据添加冒号.pyf = open('usbdata.txt', 'r')fi = open('out.txt', 'w')while 1: a = f.readline().strip() if a: if len(a) == 8: # 键盘流量的话len改为16 out = '' for i in range(0, len(a), 2): if i + 2 != len(a): out += a[i] + a[i + 1] + ":" else: out += a[i] + a[i + 1] fi.write(out) fi.write('\n') else: breakfi.close()

根据加完冒号的数据获取坐标

12345678910111213141516171819202122232425#获取鼠标坐标.pynums = []keys = open('out.txt','r')f = open('xy.txt','w')posx = 0posy = 0for line in keys: if len(line) != 12 : continue x = int(line[3:5],16) y = int(line[6:8],16) if x > 127 : x -= 256 if y > 127 : y -= 256 posx += x posy += y btn_flag = int(line[0:2],16) # 1 for left , 2 for right , 0 for nothing if btn_flag == 1 : # 1 代表左键 f.write(str(posx)) f.write(' ') f.write(str(posy)) f.write('\n')f.close()

之后可以用gnuplot或者用python脚本画图

12#gnuplot画图命令gnuplot> plot "xy.txt" 1234567#根据坐标画图.pyimport matplotlib.pyplot as pltimport numpy as npx, y = np.loadtxt('xy.txt', delimiter=' ', unpack=True)plt.plot(x, y, '.')plt.show()

如果图片是反的或者是镜像的,可以用美图秀秀或者PS处理一下

总结一下我的做题步骤(WSL):

一、先用wireshark查看流量包,看看是键盘流量还是鼠标流量(有可能二者都有哦)

二、用tshark提取数据

三、用脚本添加冒号

四、翻译文字并处理或者提取坐标画图

6、数位板流量分析:

先导出数据

tshark -r hard_Digital_plate.pcapng -T fields -e usbhid.data | sed ‘/^\s*$/d’ > out.txt

#提取并去除空行

类似于:

1234567891011121308803708951e00000000000008803708951e00000000000008803708951e00000000000008803708951e00000000000008803708951e00000000000008813708951e65000000000008813808951ec1000000000008813908951e2e010000000008813a08951e94010000000008813b08951ee2010000000008813c08951e1c020000000008813c08951e44020000000008813c08951e610200000000

第二个字节代表了是否启用0x81位有效坐标,同时后四位还有数位板的压感值。

当第二字节为0x81时,说明数位板正在作画,且第8字节和第9字节存在压感值,当第二字节为0x80时,说明数位板没有落笔,即没有作画,此时第8字节和第9字节不存在压感,为0x0000。

坐标分析直接说结论,第5-8位是x轴坐标,第9-12位是y轴坐标,并且是小端序储存方法。

例如:

08803708951e000000000000这个数据,0x3708是x坐标信息,0x951e是y坐标信息,但是由于数据为小端序储存,实际x坐标为0x0837,y坐标为0x1e95。

分析数据,分为压感和低压感的数据,直接用CTFD中的脚本跑出坐标

然后用kali中的gunplot画图

MIsc——图片题思路:

Tips:各种隐写可以先拉入一键梭哈网站解析一下:https://aperisolve.fr/

1、 查看图片属性的详细信息(可能关键信息就在里面)2、 拉入010,查看文件头尾,可能会有不同类型文件文件头混用3、 CRC错误(不能乱改),改宽高,17~20是宽,21~24是高(可用Pictools脚本快速爆破)4、 stegsolve(拉入kali用zsteg快速查看)

信息藏在图片中有时候会看不出来,所以还是要用stegsolve.jar过一遍

5、 foremost(配置好后可以直接右键发送-用foremost提取)6、 LSB(最低有效位)隐写:没有密钥的情况

直接拉入kali用zsteg分析

zsteg -a (文件名) #查看各个通道的lsb

#-b的位数是从1开始的 zsteg zlib.bmp -b 1 -o xy -v

提取文件并导出 zsteg -e b1,r,lsb,xy 3.png > 123.jpg

有密钥的情况(cloacked-pixel)

lsb隐写的可能是加密后的数据,i春秋最喜欢的cloacked-pixel

拉到kali/WSL里用cloacked-pixel命令解密出数据

1python2 cloacked-pixel-master/lsb.py extract 0.png out.data f78dcd383f1b574b

0.png是隐写后的图片;out.data是隐写内容保存的位置;f78dcd383f1b574b是密钥

LSB低位隐写:

用CTFD中的脚本跑出隐藏的图片

7、 图片盲水印隐写(两张图片)

先把要处理的图片拉入BlindWaterMark-master文件夹,然后使用如下命令

py bwmforpy3.py decode day1.png day2.png flag.png –oldseed

Tips:这里还会出现FFT(傅里叶盲水印):直接运行CTFD中的FFT.py

8、 IDAT块隐写:

拉到kali里用pngcheck -v 0.png检查IDAT,

然后用010提取数据扔进zlib脚本解压获得原始数据

将异常的IDAT数据块斩头去尾之后使用脚本解压,在python2代码如下:

123456import zlibimport binasciiIDAT = "789C5D91011280400802BF04FFFF5C75294B5537738A21A27D1E49CFD17DB3937A92E7E603880A6D485100901FB0410153350DE83112EA2D51C54CE2E585B15A2FC78E8872F51C6FC1881882F93D372DEF78E665B0C36C529622A0A45588138833A170A2071DDCD18219DB8C0D465D8B6989719645ED9C11C36AE3ABDAEFCFC0ACF023E77C17C7897667".decode('hex')result = binascii.hexlify(zlib.decompress(IDAT))print (result.decode('hex'))print (len(result.decode('hex'))) 9、 png数据末尾藏zip:

补上压缩包的文件头,然后提取出来,解压(可用stegpy得到解压密码)。

或者直接foremost提取

10、 图片的分离和拼接

(1)可以用kali的convert分离和montage拼接命令

分解GIF的命令:convert glance.gif flag.png

水平镜像翻转图片:convert -flop reverse.jpg reversed.jpg

垂直镜像翻转图片:convert -flip reverse.jpg reversed.jpg

合成图片的命令:montage flag*.png -tile x1 -geometry +0+0 flag.png

-tile是拼接时每行和每列的图片数,这里用x1,就是只一行

-geometry是首选每个图和边框尺寸,我们边框为0,图照原始尺寸即可

(2)使用在线网站分解:https://tu.sioe.cn/gj/fenjie/

(3)用py脚本跑

12345678910import osfrom PIL import Imageim = Image.new('RGB', (2*201, 600)) # new(mode,size) size is long and widthPATH = 'E:/ctf/glance.gif'FILE_NAME = [i for i in os.listdir(PATH)]width = 0for i in FILE_NAME: im.paste(Image.open(PATH+i), (width, 0, width+2, 600)) # box is 左,上,右,下 width += 2im.show() 11、 像素点合成

注:Linux wc命令用于计算字数。

-l或–lines 显示行数。

-w或–words 只显示字数。

-c或–bytes或–chars 只显示Bytes数。

可以改个标题后用在线网站将txt转换为ppm文件

12、 Image conbiner(两张图片):

两张图片可能有部分残缺(可以互补)

给了两张图片时,用Stegsolve.jar,打开其中一张,

然后再Analyze-Image conbiner打开另一张图片

13、 图片已加密,且密码信息在图片里:(OurSecret)

拉入OurSecret,输入密码解密,得到隐藏文件

14、 拼图题:碎图片合成一张图片12#在Windows中使用imagemagick处理magick.exe montage *.png -tile 18x10 -geometry 125x125+0+0 flag.jpg 1234567#在kali中处理拉入kali里处理,如果是碎的图片,先使用 montage *.PNG -tile 12x12 -geometry +0+0 out.png合成一张图片*.png表示匹配所有图片-tile表示图片的张数-geometry +0+0表示每张图片的间距为0合成后要先查看图片的宽高(宽高要相等,不相等要用PS调整) 然后使用gaps智能拼图(在kali和wsl里使用都可以)12345678gaps --image=out.png --generation=30 --population=144 --size=30 --save --image 指向拼图的路径--size 拼图块的像素尺寸--generations 遗传算法的代的数量--population 个体数量--verbose 每一代训练结束后展示最佳结果--save 将拼图还原为图像 123456gaps --image=flag.jpg --generations=50 --population=180 --size=125 --verbose-generations 你要迭代多少次-population 你有多少个小拼图--size 每张小图,也就是拼图小块的大小--verbose 实时显示 15、 bmp宽高爆破:

删除文件头,并保存为文件名.data,然后用GIMP打开修改宽高(这个比较方便)

或者直接用bmp爆破脚本跑 python script.py -f filename.bmp

1#用这个脚本要注意对图片一个个使用 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465import osimport timeimport mathimport argparseparser = argparse.ArgumentParser()parser.add_argument("-f", type=str, default=None, required=True, help="输入同级目录下图片的名称")args = parser.parse_args()SAVE_DIR = os.getcwd()def save_img(data, width=None, height=None, sqrt_num=None): with open(os.path.join(SAVE_DIR, "fix_width.bmp"), "wb") as f: f.write(data[:0x12] + width.to_bytes(4, byteorder="little", signed=False) + data[0x16:]) with open(os.path.join(SAVE_DIR, "fix_height.bmp"), "wb") as f: f.write(data[:0x16] + height.to_bytes(4, byteorder="little", signed=False) + data[0x1a:]) with open(os.path.join(SAVE_DIR, "fix_sqrt.bmp"), "wb") as f: f.write(data[:0x12] + sqrt_num.to_bytes(4, byteorder="little", signed=False) * 2 + data[0x1a:])def get_pixels_size(data): bfSize = int.from_bytes(data[0x2:0x2+4], byteorder="little", signed=False) bfOffBits = int.from_bytes( data[0xa:0xa+4], byteorder="little", signed=False) biBitCount = int.from_bytes( data[0x1c:0x1c+2], byteorder="little", signed=False) channel = biBitCount // 8 # 由于宽高都会被修改,所以我计算出来的Padding_size也不是正确的,没有意义 # padding_size = (4 - col * channel % 4) * row if col * channel % 4 != 0 else 0 # pixels_size = (bfSize - bfOffBits - padding_size) // channel return (bfSize - bfOffBits) // channelif __name__ == '__main__': file_path = os.path.abspath(args.f) if os.path.splitext(args.f)[-1] != ".bmp": print("您的文件后缀名不为BMP!") time.sleep(1) exit(-1) with open(file_path, "rb") as f: data = f.read() col = abs(int.from_bytes(data[0x12:0x12+4], byteorder="little", signed=True)) row = abs(int.from_bytes(data[0x16:0x16+4], byteorder="little", signed=True)) pixels_size = get_pixels_size(data) width, height = pixels_size // row, pixels_size // col sqrt_num = int(math.sqrt((pixels_size))) save_img(data, width=width, height=height, sqrt_num=sqrt_num) print("温馨提示:由于填充字节的问题,所以可能会偏差几个像素!") print(f"1.修复宽度: {width}") print(f"2.修复高度: {height}") print(f"3.修复宽度高度为: {sqrt_num}") time.sleep(1) 16、 可以试试用stegdectet看看是什么加密:

.\stegdetect.exe -t jopi -s 10.0 .\0.jpg

stegdectet

17、 JPHS加密:

有可能会有密码

导出步骤 Select File –> seek –> demo.txt –> Save the file

18、BMP可能是wbStego4open隐写,用wbStego4open直接decode19、steghide12#如果密码已经知道了steghide extract -sf filename -p passwd

在WSL或者kali里用Stegseek跑(字典在wordlist里)

123456789101112#如果密码未知可以用下面这个脚本爆破#bruteStegHide.sh#!/bin/bashfor line in `cat $2`;do steghide extract -sf $1 -p $line > /dev/null 2>&1 if [[ $? -eq 0 ]];then echo 'password is: '$line exit fidone 12#或者在WSL或者kali里用Stegseek跑(字典在wordlist里)stegseek filename rockyou.txt 20、apngdis_gui

一张png图片还可能是apng,直接用apngdis_gui跑一下,可以分出两张相似的png

21、outguess123outguess -k "abc" -r mmm.jpg flag.txt#-k 后面跟的是解密的密钥#flag.txt是解密后数据保存的位置 22、近邻法缩放图片

在PS中打开图片,然后在更改图像大小中,将宽高调成指定像素并将重新采样选项选为邻近(硬边缘)

23、F5-steganography-master

把要解密的图片拉到F5文件夹中

12345#有密码的情况java Extract beautiful.jpg -p passwd#无密码的情况java Extract beautiful.jpg#解密出来的数据会放到F5文件夹下的output.txt中 24、pixeljihad(有密码)

直接使用在线网站解密即可:PixelJihad (sekao.net)

25、隐写文本可能藏在原图片和隐写文件的中间

直接在010中搜索IEND,然后查看后面有没有额外内容即可

26.提取图片中等距的像素点得到隐写的图片

在windows的终端wt中运行CTFD中的Get_Pixels.py

1234py main.py -f arcaea.png -p 0x0+3828x2148 -n 12x12py main.py -f 要解密的图片 -p 第一个像素点的XY坐标+最后一个像素点的XY坐标 -n 两个等距像素点的XY距离的差值如果是等距离提取整张图片中所有像素点,要注意右下角那个点的位置XY都要减去一倍的距离Tips:在PS中按F8就可以看到每个像素点的具体坐标了 【二维码类】:1、 bmp转二维码2、 16进制转pyc3、 字符串制作二维码123直接右键使用B神的脚本制作二维码,制作前注意要把字符串的长度手动修正为平方数1.0 1制作二维码2.00 11制作二维码 4、 四个TTL值转换一个字节的二进制数5、 aztec code

![aztec code](/images/aztec code.gif)

Misc——excel题思路:

1、拉入010或者记事本,查找flag

Misc——PDF题思路:

1、直接binwalk或者foremost解出隐藏文件

2、可能是wbStego4open隐写,用wbStego4open直接decode

Misc——Word题思路

1、直接foremost出隐藏文件

Misc——txt题思路:

1、 有可能是ntfs,直接用NtfsStreamsEditor2扫描所在文件夹,然后导出可疑文件

【如果是压缩包,一定要用winrar解压】

2、可能是wbStego4open隐写,用wbStego4open直接decode

3、如果是那种文件夹套文件夹的题目,可以直接把路径粘贴到everything中,让everything一把梭

Misc——html题思路:

1、可能是wbStego4open隐写,用wbStego4open直接decode

Misc——压缩包思路:

Tips:压缩包的密码可以是中英文字符和符号,也可以是中文语句的首字母

​ 【 遇到加密的直接1-8位纯数字爆破一下】

1、压缩包伪加密zip文件:

可以直接用ZipCenOp.jar修复:

java -jar ZipCenOp.jar r screct.zip

WinRAR打开、010改标志位、binwalk直接分离

如果压缩文件已损坏,则尝试用winrar打开,工具-修复压缩包

压缩源文件数据区:7-8位表示有无加密

压缩源文件目录区:9-10位表示是否是伪加密

rar文件:

第24个字节尾数为4表示加密,0表示无加密,将尾数改为0即可破解伪加密

2、CRC爆破(压缩包中文件比较小的时候)

使用CRC爆破需要文件大小小于等于18个字节

参考文章:https://blog.csdn.net/mochu7777777/article/details/110206427

可以使用CTFD中的两种脚本爆破一下(速度不同)

3、明文攻击已知所有的明文使用Advanced Archive Password Recovery破解

有和压缩包中的一样(CRC值一样)的文件时,压缩然后用AAPR进行明文攻击

使用pkcrack破解12#将pkcrack作为系统命令使用cp pkcrack /usr/sbin/pkcrack 1pkcrack -c "README.txt" -p README.txt -C flag.zip -P README.zip 1234-C:要破解的目标文件(含路径)-c:破解文件中的明文文件的名字(其路径不包括系统路径,从zip文件一层开始)-P:压缩后的明文文件-p:压缩的明文文件中明文文件的名字(也就是readme.txt在readme.zip中的位置) 已知部分明文

利用bkcrack进行攻击

参考资料

12https://www.freebuf.com/articles/network/255145.htmlhttps://byxs20.github.io/posts/30731.html#%E6%80%BB%E7%BB%93

该利用方法的具体要求如下:

1234至少已知明文的12个字节及偏移,其中至少8字节需要连续。明文对应的文件加密方式为ZipCrypto StoreTips:进行明文攻击前要判断制作压缩包的压缩工具,然后对已知明文使用特定工具进行压缩,再进行明文攻击例子:bkcrack -C \$R9EG7XR.zip -c flag.txt -k 958597ea b9f7740b 622aed5e -d flag.txt

如何判断压缩工具(参考自B神的博客)

压缩攻击 VersionMadeBy(压缩所用版本) Bandzip 7.06 20 Windows自带 20 WinRAR 4.20 31 WinRAR 5.70 31 7-Zip 63

bkcrack常用参数

12345678-c 要解密的文件-P 已知明文所在的压缩包-p 已知的明文部分-x 压缩包内目标文件的偏移地址 部分已知明文值-C 加密压缩包-o offset -p参数指定的明文在压缩包内目标文件的偏移量-k 后面加破解出的三段密钥-d 后面加解密后数据的保存位置

例题:

1234#Tips:xxd // xxd 命令用于用二进制或十六进制显示文件的内容-r // 把xxd的十六进制输出内容转换回原文件的二进制内容-ps // 以 postscript的连续十六进制转储输出,这也叫做纯十六进制转储 1)简单的加密文本压缩包破解1flag{16e371fa-0555-47fc-b343-74f6754f6c01} 123456789101112131415#攻击步骤如下:#准备已知明文echo -n "lag{16e3" > plain1.txt #连续的8明文echo -n "74f6" | xxd #额外明文的十六进制格式,37346636#攻击,-o是偏移量bkcrack -C flag_360.zip -c flag.txt -p plain1.txt -o 1 -x 29 37346636#由于时间较长,为防止终端终端导致破解中断,可以加点小技巧bkcrack -C flag_360.zip -c flag.txt -p plain1.txt -o 1 -x 29 37346636 > 1.log& #后台运行,结果存入1.log#加上time参数方便计算爆破时间time bkcrack -C flag_360.zip -c flag.txt -p plain1.txt -o 1 -x 29 37346636 > 1.log&#查看爆破进度tail -f 1.log#使用该秘钥进行解密:bkcrack -C flag_360.zip -c flag.txt -k b21e5df4 ab9a9430 8c336475 -d flag.txt 12#-p 指定的明文不需要转换,-x 指定的明文需要转成十六进制#提到的偏移都是指 “已知明文在加密前文件中的偏移”。 2)利用PNG图片文件头破解123456#准备已知明文echo 89504E470D0A1A0A0000000D49484452 | xxd -r -ps > png_header#攻击time bkcrack -C png4.zip -c 2.png -p png_header -o 0 >1.log&tail -f 1.logtime bkcrack -C png4.zip -c flag.txt -k e0be8d5d 70bb3140 7e983fff -d flag.txt 3)利用压缩包格式破解12345将一个名为flag.txt的文件打包成ZIP压缩包后,发现文件名称会出现在压缩包文件头中,且偏移固定为30。且默认情况下,flag.zip也会作为该压缩包的名称。已知的明文片段有:“flag.txt” 8个字节,偏移30ZIP本身文件头:50 4B 03 04 ,4字节满足12字节的要求 123456789echo -n "flag.txt" > plain1.txt #-n参数避免换行,不然文件中会出现换行符,导致攻击失效time bkcrack -C test5.zip -c flag.zip -p plain1.txt -o 30 -x 0 504B0304 >1.log&tail -f 1.logbkcrack -C test5.zip -c flag.zip -k b21e5df4 ab9a9430 8c336475 -d flag.zip#但若想解密2.png,由于是ZipCrypto deflate加密的#使用deflate算法压缩的文件,解码出来的是Deflate的数据流#所以解密后需要bkcrack/tool内的inflate.py脚本再次处理bkcrack -C test5.zip -c 2.png -k b21e5df4 ab9a9430 8c336475 -d 2.pngpython3 inflate.py < 2.png > 2_out.png

Tips:如果这里用”XXXXX.txt”作为plaint1.txt无法破解出密钥,可以试试直接去掉后缀再作为plaint1.txt

例如:NKCTF2023——五年Misc,三年模拟

123#echo -n "handsome.txt" > plain1.txt 破解失败echo -n "handsome" > plain1.txttime bkcrack -C test5.zip -c handsome.zip -p plain1.txt -o 30 -x 0 504B0304 >1.log& 4)EXE文件格式破解12EXE文件默认加密情况下,不太会以store方式被加密,但它文件格式中的的明文及其明显,长度足够。如果加密ZIP压缩包出现以store算法存储的EXE格式文件,很容易进行破解。大部分exe中都有这相同一段,且偏移固定为64:

img

1234echo -n "0E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000" | xxd -r -ps > mingwentime bkcrack -C nc64.zip -c nc64.exe -p mingwen -o64 >1.log&tail -f 1.logbkcrack -C nc64.zip -c nc64.exe -k b21e5df4 ab9a9430 8c336475 -d nc64.exe 5 )流量包pcapng格式解密123echo -n "00004D3C2B1A01000000FFFFFFFFFFFFFFFF" | xxd -r -ps > pcap_plain1time bkcrack -C 3.zip -c capture.pcapng -p pcap_plain1 -o 6bkcrack -C 3.zip -c capture.pcapng -k e33a580c c0c96a81 1246d892 -d out.pcapng 6)网站相关文件破解123robots.txt的文件开头内容通常是User-agent: * html文件开头通常是 xml文件开头通常是 123echo -n '' > xml_plaintime bkcrack -C xml.zip -c 123/web.xml -p xml_plain -o 0 //注意相对路径bkcrack -C xml.zip -c 123/web.xml -k e0be8d5d 70bb3140 7e983fff -d web.xml 7)SVG文件格式破解123456789#SVG是一种基于XML的图像文件格式echo -n '


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3